﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
using Microsoft.Practices.EnterpriseLibrary.Common;
using System.Configuration;
using Insifo.BE;
using Insifo.BE.Seg;

namespace Insifo.DL.Seg
{
    public class DLUsuario
    {
        #region  Members


        /// <summary>
        /// Método obtiene Datos del Usuario
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>
        /// 
        //public BEUsuario Obtener(string pstrUsuario)
        //{
        //    BEUsuario be = new BEUsuario();
        //    SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
        //    DbCommand dbCmd = sqlDB.GetStoredProcCommand("Usp_CIDE_SEG_Usuario_Obtener");

        //    try
        //    {
        //        dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;
        //        sqlDB.AddInParameter(dbCmd, "@CodigoUsuario", DbType.String, pstrUsuario);

        //        using (IDataReader reader = sqlDB.ExecuteReader(dbCmd))
        //        {
        //            while (reader.Read())
        //            {
        //                be.Nombre = DBValue.Get<String>(reader, "Nombre");
        //                break;

        //            }
        //        }
        //    }
        //    catch (Exception)
        //    {
        //        throw;
        //    }

        //    finally
        //    {                
               
        //            //dbCmd.Connection.Close();
        //        dbCmd.Dispose();
        //    }
        //    return be;
        //}

        public DataSet Listar(BEUsuario pbe)
        {
            DataSet ds = new DataSet();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_SEG_Usuario_Listar");
            try
            {
                dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;
                sqlDB.AddInParameter(dbCmd, "@as_CodigoUsuario", DbType.String, pbe.CodigoUsuario);
                sqlDB.AddInParameter(dbCmd, "@as_Tipo", DbType.String, pbe.Tipo);
                sqlDB.AddInParameter(dbCmd, "@as_Nombre", DbType.String, pbe.Nombre);
                sqlDB.AddInParameter(dbCmd, "@as_ExpiraPassword", DbType.String, pbe.ExpiraPassword);
                sqlDB.AddInParameter(dbCmd, "@as_Administrador", DbType.String, pbe.Administrador);
                sqlDB.AddInParameter(dbCmd, "@as_Estado", DbType.String, pbe.Estado);
                sqlDB.AddInParameter(dbCmd, "@ai_Pagina", DbType.Int32, pbe.Pagina);
                ds = sqlDB.ExecuteDataSet(dbCmd);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                dbCmd.Dispose();
            }
            return ds;
        }

        /// <summary>
        /// Método obtiene Datos del Usuario
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>
        /// 

        public BEUsuario Obtener(BEUsuario pbe)
        {
            BEUsuario be = new BEUsuario();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_SEG_Usuario_Obtener");
            try
            {
                dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;
                sqlDB.AddInParameter(dbCmd, "@as_CodigoUsuario", DbType.String, pbe.CodigoUsuario);

                using (IDataReader reader = sqlDB.ExecuteReader(dbCmd))
                {
                    while (reader.Read())
                    {
                        be.CodigoUsuario = DBValue.Get<String>(reader, "CodigoUsuario");
                        be.Tipo = DBValue.Get<String>(reader, "Tipo");
                        be.Nombre = DBValue.Get<string>(reader, "Nombre");

                        be.Clave = DBValue.Get<string>(reader, "Clave");
                        be.ExpiraPassword = DBValue.Get<string>(reader, "ExpiraPassword");
                        be.Administrador = DBValue.Get<string>(reader, "Administrador");
                        be.PECO = DBValue.Get<string>(reader, "PECO");
                        be.IdPersona = DBValue.Get<Int32>(reader, "IdPersona");

                        be.Estado = DBValue.Get<String>(reader, "Estado");
                        be.UsuarioModificacion = DBValue.Get<String>(reader, "UsuarioModificacion");
                        be.FechaModificacion = DBValue.Get<DateTime>(reader, "FechaModificacion");
                        be.UsuarioCreacion = DBValue.Get<String>(reader, "UsuarioCreacion");
                        be.FechaCreacion = DBValue.Get<DateTime>(reader, "FechaCreacion");
                        //ReiniciarPassword
                        be.ReiniciarPassword = DBValue.Get<string>(reader, "ReiniciarPassword");
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            finally
            {
                dbCmd.Dispose();
            }
            return be;
        }

        /// <summary>
        /// Método Inserta un Nivel Alerta
        /// </summary>
        /// <returns>Devuelve una entidad</returns>
        public BEUsuario Insertar(BEUsuario pbe)
        {
            BEUsuario be = new BEUsuario();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_SEG_Usuario_Insertar");

            try
            {
                dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;

                sqlDB.AddInParameter(dbCmd, "@as_CodigoUsuario", DbType.String, pbe.CodigoUsuario);
                sqlDB.AddInParameter(dbCmd, "@as_Tipo", DbType.String, pbe.Tipo);
                sqlDB.AddInParameter(dbCmd, "@as_Nombre", DbType.String, pbe.Nombre);
                sqlDB.AddInParameter(dbCmd, "@as_Clave", DbType.String, pbe.Clave);
                sqlDB.AddInParameter(dbCmd, "@as_ExpiraPassword", DbType.String, pbe.ExpiraPassword);
                sqlDB.AddInParameter(dbCmd, "@as_Administrador", DbType.String, pbe.Administrador);
                sqlDB.AddInParameter(dbCmd, "@as_PECO", DbType.String, pbe.PECO);
                sqlDB.AddInParameter(dbCmd, "@ai_IdPersona", DbType.Int32, pbe.IdPersona);

                sqlDB.AddInParameter(dbCmd, "@as_Estado", DbType.String, pbe.Estado);
                //sqlDB.AddInParameter(dbCmd, "@as_UsuarioModificacion", DbType.String, pbe.UsuarioModificacion);
                sqlDB.AddInParameter(dbCmd, "@as_UsuarioCreacion", DbType.String, pbe.UsuarioCreacion);

                using (IDataReader reader = sqlDB.ExecuteReader(dbCmd))
                {
                    while (reader.Read())
                    {
                        be.CodigoUsuario = DBValue.Get<String>(reader, "CodigoUsuario");
                        be.FechaCreacion = DBValue.Get<DateTime>(reader, "FechaCreacion");
                        //Error
                        be.Error = DBValue.Get<Int32>(reader, "CodigoError");
                        be.Mensaje = DBValue.Get<String>(reader, "MensajeError");
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            finally
            {
                dbCmd.Dispose();
            }
            return be;
        }

        /// <summary>
        /// Método Actualiza un Nivel Alerta
        /// </summary>
        /// <returns>Devuelve una entidad</returns>
        public BEUsuario Actualizar(BEUsuario pbe)
        {
            BEUsuario be = new BEUsuario();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_SEG_Usuario_Actualizar");

            try
            {
                dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;

                sqlDB.AddInParameter(dbCmd, "@as_CodigoUsuario", DbType.String, pbe.CodigoUsuario);
                sqlDB.AddInParameter(dbCmd, "@as_Tipo", DbType.String, pbe.Tipo);
                sqlDB.AddInParameter(dbCmd, "@as_Nombre", DbType.String, pbe.Nombre);
                sqlDB.AddInParameter(dbCmd, "@as_Clave", DbType.String, pbe.Clave);
                sqlDB.AddInParameter(dbCmd, "@as_ExpiraPassword", DbType.String, pbe.ExpiraPassword);
                sqlDB.AddInParameter(dbCmd, "@as_Administrador", DbType.String, pbe.Administrador);
                sqlDB.AddInParameter(dbCmd, "@as_PECO", DbType.String, pbe.PECO);
                sqlDB.AddInParameter(dbCmd, "@ai_IdPersona", DbType.Int32, pbe.IdPersona);

                sqlDB.AddInParameter(dbCmd, "@as_Estado", DbType.String, pbe.Estado);
                sqlDB.AddInParameter(dbCmd, "@as_UsuarioModificacion", DbType.String, pbe.UsuarioModificacion);

                using (IDataReader reader = sqlDB.ExecuteReader(dbCmd))
                {
                    while (reader.Read())
                    {
                        be.CodigoUsuario = DBValue.Get<String>(reader, "CodigoUsuario");
                        be.FechaModificacion = DBValue.Get<DateTime>(reader, "FechaModificacion");
                        //Error
                        be.Error = DBValue.Get<Int32>(reader, "CodigoError");
                        be.Mensaje = DBValue.Get<String>(reader, "MensajeError");
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            finally
            {
                dbCmd.Dispose();
            }
            return be;
        }

        /// <summary>
        /// Método Actualiza el Estado Nivel Alerta
        /// </summary>
        /// <returns>Devuelve una entidad</returns>
        public BEUsuario Eliminar(BEUsuario pbe)
        {
            BEUsuario be = new BEUsuario();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_SEG_Usuario_Eliminar");

            try
            {
                dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;

                sqlDB.AddInParameter(dbCmd, "@as_CodigoUsuario", DbType.String, pbe.CodigoUsuario);
                sqlDB.AddInParameter(dbCmd, "@as_Estado", DbType.String, pbe.Estado);
                sqlDB.AddInParameter(dbCmd, "@as_UsuarioModificacion", DbType.String, pbe.UsuarioModificacion);
                sqlDB.AddInParameter(dbCmd, "@adt_FechaModificacion", DbType.DateTime, pbe.FechaModificacion);

                using (IDataReader reader = sqlDB.ExecuteReader(dbCmd))
                {
                    while (reader.Read())
                    {
                        be.CodigoUsuario = DBValue.Get<String>(reader, "CodigoUsuario");
                        be.FechaModificacion = DBValue.Get<DateTime>(reader, "FechaModificacion");
                        //Error
                        be.Error = DBValue.Get<Int32>(reader, "CodigoError");
                        be.Mensaje = DBValue.Get<String>(reader, "MensajeError");
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            finally
            {
                dbCmd.Dispose();
            }
            return be;
        }

        /// <summary>
        /// Método obtiene las Companias por Usuario
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>
        public DataSet ListarCompaniasPorUsuario(string psrtUsuario)
        {
            DataSet ds = new DataSet();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_SEG_Compania_X_Usuario_Listar");
            dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;
            try
            {
                sqlDB.AddInParameter(dbCmd, "@as_CodigoUsuario", DbType.String, psrtUsuario);
                ds = sqlDB.ExecuteDataSet(dbCmd);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
               
                    //dbCmd.Connection.Close();
                dbCmd.Dispose();
            }
            return ds;
        }

        /// <summary>
        /// Método que Valida el Usuario y Clave
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>
        public BEUsuario ValidarUsuario(string psrtUsuario, string pstrClave, int pintNumeroIntentos)
        {
            BEUsuario be = new BEUsuario();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_SEG_Usuario_Validar");
            dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;
            try
            {
                sqlDB.AddInParameter(dbCmd, "@as_CodigoUsuario", DbType.String, psrtUsuario);
                sqlDB.AddInParameter(dbCmd, "@as_Clave", DbType.String, pstrClave);
                sqlDB.AddInParameter(dbCmd, "@ai_NumeroIntentos", DbType.Int32, pintNumeroIntentos);

                using (IDataReader dr = sqlDB.ExecuteReader(dbCmd))
                {
                    while (dr.Read())
                    {
                        be.Ref = DBValue.Get<int>(dr, "Excepcion");
                        be.IdPersona = DBValue.Get<int>(dr, "IdPersona");
                        be.Administrador = DBValue.Get<string>(dr, "Administrador");

                        be.Error = DBValue.Get<int>(dr, "Excepcion");
                        be.Mensaje = DBValue.Get<string>(dr, "Mensaje");
                        break;
                    }
                }

            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                //if (dbCmd.Connection.State == ConnectionState.Open)
                    //dbCmd.Connection.Close();
                dbCmd.Dispose();
            }
            return be;
        }

        /// <summary>
        /// Método que Valida el Usuario Exista o Este Activo
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>
        public BEUsuario ValidarUsuario(int pintIdCompania, int pintIdAplicacion, string psrtCodigoUsuario)
        {
            BEUsuario be = new BEUsuario();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_SEG_Usuario_Validar_Existe");
            dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;
            try
            {
                sqlDB.AddInParameter(dbCmd, "@ai_IdCompania", DbType.String, pintIdCompania);
                sqlDB.AddInParameter(dbCmd, "@ai_IdAplicacion", DbType.String, pintIdAplicacion);
                sqlDB.AddInParameter(dbCmd, "@as_CodigoUsuario", DbType.String, psrtCodigoUsuario);
                using (IDataReader dr = sqlDB.ExecuteReader(dbCmd))
                {
                    while (dr.Read())
                    {
                        be.Ref = DBValue.Get<int>(dr, "Excepcion");
                        be.IdPersona = DBValue.Get<int>(dr, "IdPersona");
                        be.Administrador = DBValue.Get<string>(dr, "Administrador");

                        be.Error = DBValue.Get<int>(dr, "Excepcion");
                        be.Mensaje = DBValue.Get<string>(dr, "Mensaje");
                        break;
                    }
                }

            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                dbCmd.Dispose();
            }
            return be;
        }

        /// <summary>
        /// Método que Valida el Usuario por Compania
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>
        public BEUsuario ValidarUsuarioPorCompania(string pstrCodigoCompania, string pstrCodigoAplicacion, string psrtUsuario, string pstrClave, int pintNumeroIntentos)
        {
            BEUsuario be = new BEUsuario();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("Usp_CIDE_SEG_Usuario_Por_Validar");
            dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;
            try
            {
                sqlDB.AddInParameter(dbCmd, "@as_CodigoCompania", DbType.String, pstrCodigoCompania);
                sqlDB.AddInParameter(dbCmd, "@as_codigoaplicacion", DbType.String, pstrCodigoAplicacion);
                sqlDB.AddInParameter(dbCmd, "@as_CodigoUsuario", DbType.String, psrtUsuario);
                sqlDB.AddInParameter(dbCmd, "@as_Clave", DbType.String, pstrClave);
                sqlDB.AddInParameter(dbCmd, "@ai_NumeroIntentos", DbType.Int32, pintNumeroIntentos);

                using (IDataReader dr = sqlDB.ExecuteReader(dbCmd))
                {
                    while (dr.Read())
                    {
                        be.Ref = DBValue.Get<int>(dr, "Excepcion");
                        be.Id = DBValue.Get<int>(dr, "CodigoPersona");

                        be.Error = DBValue.Get<int>(dr, "Excepcion");
                        be.Administrador = DBValue.Get<string>(dr, "Administrador");
                        be.Mensaje = DBValue.Get<string>(dr, "Mensaje");
                        break;
                    }
                }

            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                //if (dbCmd.Connection.State == ConnectionState.Open)
                //dbCmd.Connection.Close();
                dbCmd.Dispose();
            }
            return be;
        }

        /// <summary>
        /// Método que Valida el Usuario
        /// </summary>
        /// <returns>Valida el Usuario</returns>
        public int ValidarClaveUsuario(string pstrCodigoCompania, string pstrCodigoAplicacion, string pstrUsuario, string pstrClave, int pintNumeroIntentos)
        {
            int intValido = 0;
            BEUsuario be = new BEUsuario();
            //be = ValidarUsuario(pstrCodigoCompania, pstrCodigoAplicacion, pstrUsuario, pstrClave, pintNumeroIntentos);

            switch (be.Ref)
            {
                case 1:
                    break;
                case 2:
                    break;
                case 3:
                    break;
                case 4:
                    break;
                case 5:
                    break;
                case 6:
                    break;

            }

            return intValido;
        }

        /// <summary>
        /// Método obtiene las Aplicaciones con la informacion de usuarios asignados
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>
        public DataSet ListarPorPefilAsignacion(BEUsuario pbe)
        {
            DataSet ds = new DataSet();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_SEG_Usuario_Listar_X_PerfilAsignacion");
            dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;
            try
            {
                sqlDB.AddInParameter(dbCmd, "@as_Perfil", DbType.String, pbe.CodigoUsuario);
                sqlDB.AddInParameter(dbCmd, "@as_Nombre", DbType.String, pbe.Nombre);
                sqlDB.AddInParameter(dbCmd, "@as_Estado", DbType.String, pbe.Estado);
                sqlDB.AddInParameter(dbCmd, "@ai_Pagina", DbType.Int32, pbe.Pagina);
                ds = sqlDB.ExecuteDataSet(dbCmd);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                dbCmd.Dispose();
            }
            return ds;
        }


        /// <summary>
        /// Método reincia password de un usuario
        /// </summary>
        /// <returns>Devuelve una entidad</returns>
        public BEUsuario ReiniciarClave(BEUsuario pbe)
        {
            BEUsuario be = new BEUsuario();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_SEG_Usuario_ReiniciarClave");

            try
            {
                dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;

                sqlDB.AddInParameter(dbCmd, "@as_CodigoUsuario", DbType.String, pbe.CodigoUsuario);
                sqlDB.AddInParameter(dbCmd, "@as_Clave", DbType.String, pbe.Clave);
                sqlDB.AddInParameter(dbCmd, "@as_Reiniciarpassword", DbType.String, pbe.ReiniciarPassword );
                sqlDB.AddInParameter(dbCmd, "@as_UsuarioModificacion", DbType.String, pbe.UsuarioModificacion);

                using (IDataReader reader = sqlDB.ExecuteReader(dbCmd))
                {
                    while (reader.Read())
                    {
                        be.CodigoUsuario = DBValue.Get<String>(reader, "CodigoUsuario");
                        be.FechaModificacion = DBValue.Get<DateTime>(reader, "FechaModificacion");
                        //Error
                        be.Error = DBValue.Get<Int32>(reader, "CodigoError");
                        be.Mensaje = DBValue.Get<String>(reader, "MensajeError");
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            finally
            {
                dbCmd.Dispose();
            }
            return be;
        }

        #endregion  Members
    }

        

}
